package doit20.sparksql

import org.apache.log4j.Logger
import org.apache.spark.sql.SparkSession

object Demo15 {
  def main(args: Array[String]): Unit = {

    val spark = SparkSession.builder()
      .appName("")
      .master("local")
      .getOrCreate()

    import org.apache.spark.sql.functions._
    import spark.implicits._


    val df = spark.read.option("header", true).csv("data/stu2.txt")

    /**
     * 先写一个普通的scala函数
     */
    val scalaCeiling = (age:Int)=>{
      if(age % 10 == 0) age else  (age/10 +1 ) * 10
    }
    // 然后利用内置的udf函数，将自己的普通scala函数转成 : UserDefinedFunction
    val ceiling = udf(scalaCeiling)

    // 然后就可以在DSL风格的API中调用了
    df.select('id,'name,ceiling('age))


    /**
     * hive中要使用自定义函数，需要在命名空间中通过create temporary
     * hive> add jar  "/root/abc.jar";
     * hive> create temporary function 'xx' as 'cn.doitedu.Abc';
     *
     */
    df.createTempView("df")

    /**
     * 同样，在sparksql中，要在sql语句中使用这个自定义函数，同样需要向命名空间中注册这个函数名
     */
    spark.udf.register("ceil",scalaCeiling)

    spark.sql(
      """
        |select
        |  id+10,
        |  name,
        |  ceil(age)
        |from df
        |
        |""".stripMargin).show(100,false)



    spark.close()

  }

}
